#include <stdio.h>
#include <list/linked_list.h>

int main() {
    linked_list_t *list = NEW_LINKED_LIST(int); // 创建链表

    int arr[] = {1, 3, 5, 7, 9};
    LINKED_LIST_APPEND(list, arr[0]); // 添加内存中的元素到链表
    LINKED_LIST_APPEND(list, arr[1]);
    LINKED_LIST_APPEND(list, arr[2]);
    LINKED_LIST_APPEND(list, arr[3]);
    LINKED_LIST_APPEND(list, arr[4]);
    LINKED_LIST_APPEND_IMM(list, int, 123); // 添加立即数到链表
    LINKED_LIST_APPEND_IMM(list, int, 456);

    int *p = LINKED_LIST_GET(list, 5, int); // 获取链表元素指针
    printf("list[5] = %d\n\n", *p);
    *p = 789;                               // 改变链表中元素的值

    LINKED_LIST_INSERT(list, 0, arr[4]);    // 插入内存中的元素到链表
    LINKED_LIST_INSERT(list, 7, arr[0]);
    LINKED_LIST_INSERT_IMM(list, 5, int, 100); // 插入立即数到链表

    LINKED_LIST_DELETE(list, 0);            // 删除链表中的一个元素
    LINKED_LIST_DELETE(list, list->length - 1);
    LINKED_LIST_DELETE(list, 1);

    // foreach 正向遍历链表
    LINKED_LIST_FOREACH(list, e, int, {
        printf("foreach: %d\n", *e);
    });

    putchar('\n');

    // foreach 逆向遍历链表
    LINKED_LIST_FOREACH_BACKWARD(list, e, int, {
        printf("foreach backward: %d\n", *e);
    });

    putchar('\n');

    LINKED_LIST_DELETE_ALL(list); // 删除所有元素

    linked_list_t *list2 = NEW_LINKED_LIST(int); // 创建第二个链表
    LINKED_LIST_APPEND_IMM(list2, int, 10000); // 添加立即数到链表
    LINKED_LIST_APPEND_IMM(list2, int, 10001); // 添加立即数到链表

    LINKED_LIST_CONCAT(list, list2); // 拼接链表

    // foreach 正向遍历链表
    LINKED_LIST_FOREACH(list, e, int, {
        printf("foreach 2: %d\n", *e);
    });

    FREE_LINKED_LIST(list);  // 释放链表

    puts("END");
    return 0;
}